Skip to content

DynamicAPInt: Support APInt constructor. #146301

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 1, 2025
Merged

Conversation

zakk0610
Copy link
Member

This PR introduces a constructor for DynamicAPInt that takes an APInt object as input to simplifies the creation of a large numbers.

@llvmbot
Copy link
Member

llvmbot commented Jun 30, 2025

@llvm/pr-subscribers-llvm-adt

Author: Zakk Chen (zakk0610)

Changes

This PR introduces a constructor for DynamicAPInt that takes an APInt object as input to simplifies the creation of a large numbers.


Full diff: https://github.com/llvm/llvm-project/pull/146301.diff

2 Files Affected:

  • (modified) llvm/include/llvm/ADT/DynamicAPInt.h (+9)
  • (modified) llvm/unittests/ADT/DynamicAPIntTest.cpp (+10)
diff --git a/llvm/include/llvm/ADT/DynamicAPInt.h b/llvm/include/llvm/ADT/DynamicAPInt.h
index ca010f836de6f..8b9628f26dfea 100644
--- a/llvm/include/llvm/ADT/DynamicAPInt.h
+++ b/llvm/include/llvm/ADT/DynamicAPInt.h
@@ -16,6 +16,7 @@
 #ifndef LLVM_ADT_DYNAMICAPINT_H
 #define LLVM_ADT_DYNAMICAPINT_H
 
+#include "llvm/ADT/APInt.h"
 #include "llvm/ADT/SlowDynamicAPInt.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/MathExtras.h"
@@ -116,6 +117,14 @@ class DynamicAPInt {
       : ValSmall(Val) {
     ValLarge.Val.BitWidth = 0;
   }
+  LLVM_ATTRIBUTE_ALWAYS_INLINE explicit DynamicAPInt(const APInt &Val) {
+    if (Val.getBitWidth() < 64) {
+      ValSmall = Val.getSExtValue();
+      ValLarge.Val.BitWidth = 0;
+    } else {
+      new (&ValLarge) detail::SlowDynamicAPInt(Val);
+    }
+  }
   LLVM_ATTRIBUTE_ALWAYS_INLINE DynamicAPInt() : DynamicAPInt(0) {}
   LLVM_ATTRIBUTE_ALWAYS_INLINE ~DynamicAPInt() {
     if (LLVM_UNLIKELY(isLarge()))
diff --git a/llvm/unittests/ADT/DynamicAPIntTest.cpp b/llvm/unittests/ADT/DynamicAPIntTest.cpp
index 932b750608b3e..fafd8fda08687 100644
--- a/llvm/unittests/ADT/DynamicAPIntTest.cpp
+++ b/llvm/unittests/ADT/DynamicAPIntTest.cpp
@@ -31,6 +31,16 @@ class TypeNames {
 };
 TYPED_TEST_SUITE(IntTest, TypeList, TypeNames);
 
+TYPED_TEST(IntTest, ValueInit) {
+  APInt Large(65, 0, true);
+  Large.setBit(64);
+  TypeParam DynLarge(1ll << 63);
+  EXPECT_EQ(TypeParam(Large), DynLarge + DynLarge);
+  APInt Small(64, -1, true);
+  TypeParam DynSmall(Small.getSExtValue());
+  EXPECT_EQ(TypeParam(Small), DynSmall);
+}
+
 TYPED_TEST(IntTest, ops) {
   TypeParam Two(2), Five(5), Seven(7), Ten(10);
   EXPECT_EQ(Five + Five, Ten);

@zakk0610 zakk0610 requested review from artagnon, Superty and nikic June 30, 2025 13:08
Copy link
Contributor

@nikic nikic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@zakk0610 zakk0610 merged commit 3cc200f into llvm:main Jul 1, 2025
7 checks passed
rlavaee pushed a commit to rlavaee/llvm-project that referenced this pull request Jul 1, 2025
This PR introduces a constructor for `DynamicAPInt` that takes an
`APInt` object as input to simplifies the creation of a large numbers.
rlavaee pushed a commit to rlavaee/llvm-project that referenced this pull request Jul 1, 2025
This PR introduces a constructor for `DynamicAPInt` that takes an
`APInt` object as input to simplifies the creation of a large numbers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants